package at.im.json;

import org.json.JSONException;
import org.json.JSONObject;

import at.im.utils.Box;
import at.im.utils.Entity;
import at.im.utils.EntityState;
import at.im.utils.Game;
import at.im.utils.GameBox;
import at.im.utils.GameBoxLayer;
import at.im.utils.GameBoxState;
import at.im.utils.GameEntity;
import at.im.utils.Sprite;
import at.im.utils.Tileset;
import at.im.utils.User;

public class JSONPacker 
{
	public static JSONObject packObject(int type, Object object)
	{
		switch(type)
		{
			case 0: 	return pack((Box) object); 						
			case 1: 	return pack((Entity) object); 					
			case 2: 	return pack((EntityState) object); 				
			case 3: 	return pack((Game) object);		 			
			case 4: 	return pack((GameBox) object);		 		
			case 5: 	return pack((GameBoxLayer) object);		 	
			case 6: 	return pack((GameBoxState) object);			
			case 7: 	return pack((GameEntity) object);				
			case 8: 	return pack((Sprite) object);				
			case 9: 	return pack((Tileset) object);			
			case 10:	return pack((User) object);	
			default: 	return null;
		}
	}
	
	private static JSONObject pack(User user)
	{
        JSONObject json 		= new JSONObject();
		JSONObject jsoninner 	= new JSONObject();
	    try 
	    {
	    	jsoninner.put("userId"				, user.getId());
	    	jsoninner.put("name"				, user.getName());
	    	jsoninner.put("password"			, user.getPassword());
	    	jsoninner.put("rights"				, user.getRights());
	    	jsoninner.put("changeDate"			, user.getTimeStamp());
		    json.put("User", jsoninner);
		    return json;
		} catch (JSONException e) 
		{
			return null;		
		}
	}
	
	private static JSONObject pack(Tileset tileset)
	{
        JSONObject json 		= new JSONObject();
		JSONObject jsoninner 	= new JSONObject();
	    try 
	    {
	    	jsoninner.put("tilesetId"			, tileset.getTilesetId());
	    	jsoninner.put("name"				, tileset.getName());
	    	jsoninner.put("userId"				, tileset.getUserId());
	    	jsoninner.put("isPublic"			, tileset.isPublic());
	    	jsoninner.put("changeDate"			, tileset.getTimeStamp());
	    	jsoninner.put("boxes"				, tileset.getBoxes());
	    	jsoninner.put("entities"			, tileset.getEntites());
		    json.put("Tileset", jsoninner);
		    return json;
		} catch (JSONException e) 
		{
			return null;		
		}
	}
	
	private static JSONObject pack(Sprite sprite)
	{
        JSONObject json 		= new JSONObject();
		JSONObject jsoninner 	= new JSONObject();
	    try 
	    {
	    	jsoninner.put("spriteId"			, sprite.getSpriteId());
	    	jsoninner.put("tilesetId"			, sprite.getTilesetId());
	    	jsoninner.put("image"				, sprite.getImage());
	    	jsoninner.put("frames"				, sprite.getFrames());
	    	jsoninner.put("width"				, sprite.getWidth());
	    	jsoninner.put("height"				, sprite.getHeight());
	    	jsoninner.put("fps"				, sprite.getFPS());
	    	jsoninner.put("changeDate"			, sprite.getTimeStamp());
		    json.put("Sprite", jsoninner);
		    return json;
		} catch (JSONException e) 
		{
			return null;		
		}
	}
	
	private static JSONObject pack(GameEntity gameentity)
	{
        JSONObject json 		= new JSONObject();
		JSONObject jsoninner 	= new JSONObject();
	    try 
	    {
	    	jsoninner.put("gameEntityId"		, gameentity.getGameEntityId());
	    	jsoninner.put("gameId"				, gameentity.getGameId());
	    	jsoninner.put("name"				, gameentity.getName());
	    	jsoninner.put("posX"				, gameentity.getPosX());
	    	jsoninner.put("posY"				, gameentity.getPosY());
	    	jsoninner.put("entityId"			, gameentity.getEntityId());
	    	jsoninner.put("changeDate"			, gameentity.getTimeStamp());
		    json.put("GameEntity", jsoninner);
		    return json;
		} catch (JSONException e) 
		{
			return null;		
		}
	}
	
	private static JSONObject pack(GameBoxState gameboxstate)
	{
        JSONObject json 		= new JSONObject();
		JSONObject jsoninner 	= new JSONObject();
	    try 
	    {
	    	jsoninner.put("gameBoxStateId"			, gameboxstate.getGameBoxId());
	    	jsoninner.put("gameBoxId"				, gameboxstate.getBoxId());
	    	jsoninner.put("name"						, gameboxstate.getName());
	    	jsoninner.put("boxId"					, gameboxstate.getBoxId());
	    	jsoninner.put("isVisible"				, gameboxstate.isVisible());
	    	jsoninner.put("changeDate"				, gameboxstate.getTimeStamp());
		    json.put("GameBoxState", jsoninner);
		    return json;
		} catch (JSONException e) 
		{
			return null;		
		}
	}
	
	private static JSONObject pack(GameBoxLayer gameboxlayer)
	{
        JSONObject json 		= new JSONObject();
		JSONObject jsoninner 	= new JSONObject();
	    try 
	    {
	    	jsoninner.put("gameBoxLayerId"			, gameboxlayer.getGameboxlayerId());
	    	jsoninner.put("gameId"					, gameboxlayer.getGameId());
	    	jsoninner.put("gameBoxes"				, gameboxlayer.getGameBoxes());
	    	jsoninner.put("changeDate"				, gameboxlayer.getTimeStamp());
		    json.put("GameBoxLayer", jsoninner);
		    return json;
		} catch (JSONException e) 
		{
			return null;		
		}
	}
	
	private static JSONObject pack(GameBox gamebox)
	{
        JSONObject json 		= new JSONObject();
		JSONObject jsoninner 	= new JSONObject();
	    try 
	    {
	    	jsoninner.put("gameBoxId"			, gamebox.getGameBoxId());
	    	jsoninner.put("gameBoxLayerId"		, gamebox.getGameBoxLayerId());
	    	jsoninner.put("name"					, gamebox.getName());
	    	jsoninner.put("posX"					, gamebox.getPosX());
	    	jsoninner.put("posY"					, gamebox.getPosY());
	    	jsoninner.put("defaultState"			, gamebox.getDefaultState());
	    	jsoninner.put("states"				, gamebox.getStates());
	    	jsoninner.put("changeDate"			, gamebox.getTimeStamp());
		    json.put("GameBox", jsoninner);
		    return json;
		} catch (JSONException e) 
		{
			return null;		
		}
	}
	
	private static JSONObject pack(Game game)
	{
        JSONObject json 		= new JSONObject();
		JSONObject jsoninner 	= new JSONObject();
	    try 
	    {
	    	jsoninner.put("gameId"				, game.getGameId());
	    	jsoninner.put("name"					, game.getName());
	    	jsoninner.put("userId"				, game.getUserId());
	    	jsoninner.put("changeDate"			, game.getTimeStamp());
	    	jsoninner.put("tileSetId"			, game.getTilesetId());
	    	jsoninner.put("foregroundLayerId"	, game.getForegroundlayerId());
	    	jsoninner.put("centergroundlayerId"	, game.getCenterlayoutId());
	    	jsoninner.put("backgroundlayerId"	, game.getBackgroundlayerId());
	    	jsoninner.put("backgroundimage"		, game.getBackgroundImage());
	    	jsoninner.put("entites"				, game.getEntities());
		    json.put("Game", jsoninner);
		    return json;
		} catch (JSONException e) 
		{
			return null;		
		}
	}
	
	private static JSONObject pack(Box box)
	{
        JSONObject json 		= new JSONObject();
		JSONObject jsoninner 		= new JSONObject();
	    try 
	    {
	    	jsoninner.put("boxId"			, box.getId());
	    	jsoninner.put("tilesetId"		, box.getTilesetId());
	    	jsoninner.put("name"			, box.getName());
	    	jsoninner.put("spriteId"		, box.getSpriteId());
	    	jsoninner.put("changeDate"	, box.getTimeStamp());
		    json.put("Box", box);
		    return json;
		} catch (JSONException e) 
		{
			return null;		
		}
	}
	
	private static JSONObject pack(Entity entity)
	{
        JSONObject json 		= new JSONObject();
		JSONObject jsoninner 	= new JSONObject();
	    try 
	    {
	    	jsoninner.put("entityId"		, entity.getId());
	    	jsoninner.put("tilesetId"		, entity.getTilesetId());
	    	jsoninner.put("name"			, entity.getName());
	    	jsoninner.put("defaultStateId"	, entity.getDefaultState());
	    	jsoninner.put("states"			, entity.getStates());
	    	jsoninner.put("changeDate"		, entity.getTimeStamp());
		    json.put("Entity", jsoninner);
		    return json;
		} catch (JSONException e) 
		{
			return null;		
		}
	}
	
	private static JSONObject pack(EntityState entitystate)
	{
        JSONObject json 		= new JSONObject();
		JSONObject jsoninner 	= new JSONObject();
	    try 
	    {
	    	jsoninner.put("entityStateId"	, entitystate.getEntityStateId());
	    	jsoninner.put("entityId"		, entitystate.getEntityId());
	    	jsoninner.put("name"			, entitystate.getName());
	    	jsoninner.put("spriteId"		, entitystate.getSpriteId());
	    	jsoninner.put("isVisible"		, entitystate.isVisible());
	    	jsoninner.put("changeDate"		, entitystate.getTimeStamp());
		    json.put("EntityState", jsoninner);
		    return json;
		} catch (JSONException e) 
		{
			return null;		
		}
	}
}
